# -*- coding:utf-8 -*-
from functools import wraps
from flask import session,redirect,url_for,request
from .models import Users,Auth,Role
import config

#登录限制装饰器
def login_required(func):
     @wraps(func)
     def wrapper(*args, **kwargs):
         if session.get(config.ADMIN_USER_ID):
             return func(*args, **kwargs)
         else:
             return redirect(url_for('admin.login'))
     return wrapper


# -*- coding:utf-8 -*-
from functools import wraps
from flask import session,redirect,url_for,request
from .models import Users,Auth,Role
import config


# 有无访问权限装饰器： 判断用户权限控制
def admin_auth(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        user_id = session.get(config.ADMIN_USER_ID)
        admin = Users.query.join(
            Role
        ).filter(
            Role.id == Users.role_id,
            Users.uid == user_id
        ).first()
        auths = admin.jq_role.auths  # 将原本存储的权限字符串转换为列表
        auths_list1 = auths.split(",")
        auths_list2 = []
        for i, val in enumerate(auths_list1):
            auths_list2.append(int(val))
        auths_list3 = []
        auth_list = Auth.query.all()
        for i in auth_list:
            for v in auths_list2:
                if v == i.id:
                    auths_list3.append(i.url)
        rule = str(request.url_rule)
        if rule not in auths_list3:
            return "对不起，您无权访问，您拥有的权限为{}, 现在访问的为{}".format(auths_list3, rule)
        # else:
        #     print("可以访问")
            # return redirect(url_for('admin.index'))
        return func(*args, **kwargs)
    return wrapper


#文章详情页面路由
@bp.route('/article_details/<int:id>',methods=['GET','POST'])#定义路由和指定访问方法
def article_details(id):#定义视图函数
    if request.method=='GET':#如果访问方法为GET方法
        #取得新闻详情
        news1=Articles.query.filter(Articles.aid==id).first_or_404()
        #取得新闻的作者
        author1=Users.query.filter(Users.uid==news1.author_id).first()
        if author1:#如果author1不为空
            author = author1.username#从author1对象中取得其属性值作为author变量的值
        else:
            author='无名'#如果author1对象为空，则author直接赋值为无名
        # 更新点击次数
        db.session.query(Articles).filter_by(aid=id).update({Articles.clicks: Articles.clicks+1})
        db.session.commit()#提交事务

        # 取得上一条记录--------------------小于当前id，倒序第一个，就是上一条
        news2 = Articles.query.filter(Articles.aid < id).order_by(Articles.aid.desc()).first()

        #取得下一条记录------------------------大于当前id，正序第一个就是下一篇
        news3 = Articles.query.filter(Articles.aid > id).order_by(Articles.aid.asc()).first()

        #热门资讯--------------------点击量最多的前５个就是热门
        news4=Articles.query.filter(Articles.is_delete==0).order_by(Articles.clicks.desc()).limit(5)
        list = []#定义列表list
        data = {}#定义字典data
        nav = Articles_Cat.query.all()  # 取得所有分类
        for cat in nav:  # 遍历对象nav
            data = dict(cat_id=cat.cat_id, parent_id=cat.parent_id, cat_name=cat.cat_name, )  # 构造字典数据
            list.append(data)  # 将字典数据追加到列表中
        cat = build_cat_tree(list, 0, 0)  # 构造目录树
        zz = build_cat_table(cat, parent_title='顶级菜单')  # 构造含有CSS样式的下拉列表菜单


        return render_template('front/article_details.html', news1=news1, news2=news2, news3=news3, news4=news4,
                           author=author, cat=zz)

    else:
        if request.method=='POST':#如果访问方法为POST方法
            form = CommentForm(request.form)  # 实例化定义的添加评论表单;
            data = form.data#获取表单数据
            id = data['article_id']#从表单中取得article_id的值
            if session.get('username') == None:#用户没有登录，则跳转到登陆页面
                url=url_for('front.login') +'?url=article_details/'+id#构造重定向网址
                return redirect(url)#网页重定向
            if form.validate():#如果表单验证通过
                comment_content = data['comment_content']#从表单中取值赋给comment_content
                captcha = data['captcha']#从表单中取值赋给captcha
                id = data['article_id']#从表单中取值赋给id
                title = data['article_title']#从表单中取值赋给title
                if session.get('image').lower() != captcha.lower():#如果POST过来的验证码与sessin中的验证码不相等
                    flash('验证码不对', 'error')  # 如果表单验证没有通过，则用消息闪现机制予以提示

                else:  #准备提交表单信息
                    username=session.get('username')#从session中取得username
                    user=Members.query.filter(Members.username==username).first_or_404()#根据用户名取得用户ID
                    uid=user.uid

                    #准备POST的数据
                    post = Comment(
                        title=title,  # 评论的文章标题
                        aid=id,  # 评论的文章ID
                        comment=comment_content,  # 评论内容
                        status=0, # 评论审核转台
                        parent_id=1,  # 评论的层次关系
                        add_time=datetime.datetime.now(),
                        user_name=session.get('username'),  # 获取session
                        user_id=uid,#评论用户ID
                        comment_ip=request.remote_addr  # 评论者的IP地址
                    )
                    db.session.add(post)  # 添加评论
                    db.session.commit()  # 提交事务
                    flash('评论添加成功', 'ok')  # 消息闪现
                    return redirect(url_for('front.article_details',id=id))#网页重定位
            else:
                errors = form.errors  # 获取表单验证出错信息
                flash(errors, 'error') # 如果表单验证没有通过，则用消息闪现机制予以提示
                return redirect(url_for('front.article_details',id=id)) # 登录失败，网页重新定位到用户登陆页